/*******************************************************************************
 * * 本TS专门用于提供浏览器一侧本地化日志的实现
 ******************************************************************************/
import  formmatDate  from '.././DdFormmatDate/index.ts'

class DB_Instance {
  public DB: string = '';
  public table: string = ''
  public db
  constructor(DB: string, table: string) {
    let _this = this;
    _this.DB = DB;
    _this.table = table;
    // indexDB的实例
    // let db;

    // var objectStore
    const request = indexedDB.open(this.DB);
    request.onerror = function(event) {
      console.error('open indexedDB error');
    };
    request.onsuccess = function(event :Event) {
      // db = event.target.result
      _this.db = request.result
      console.log('now db is ' + _this.db);
      console.log('open indexedDB success');
    };
    /* 当发现目标表logs不存在的时候创建一个目标对象（表） */

    request.onupgradeneeded = function(event) {
      // db = event.target.result;
      _this.db = request.result
      if (!_this.db.objectStoreNames.contains(_this.table)) {
        /*
        * 创建一个叫做 logs 的表，只能存储javascript类型的值，主键为id
        *
        */ /* 不用time作为主键是避免数据重复，毕竟到毫秒也有可能冲突 */

        /* 创建一个叫做 logs 的表，可以存储任意类型的值，自动生成主键 */

        const objectStore = _this.db.createObjectStore(_this.table, {
          autoIncrement: true
        });

        // 创建一个索引来通过时间time搜索，时间可能是重复的，所以不能使用 unique 索引。
        objectStore.createIndex('time_idx', 'time', {
          unique: false
        });

        // 使用事务的 oncomplete 事件确保在插入数据前对象仓库已经创建完毕
        objectStore.transaction.oncomplete = function(event) {
          // 将数据保存到新创建的对象仓库
          const transaction = this.db.transaction(this.table, 'readwrite');
          const store = transaction.objectStore(this.table);
          store.add({
            time: formmatDate(new Date(), 'yyyy-MM-dd-hh'),
            msg: '新建表的首次初始化数据'
          });
          // console.log('向mylogs表中增加一条数据');
        };
      } else {
        // console.log('mylogs表之前已经建立了');
      }
    };
  };

  addLog(logStr, cnt = 1) {
    let data = {
      time: formmatDate(new Date(), 'yyyy-MM-dd-hh'),
      msg: logStr
    };
    if (cnt <= 2) {
      if (this.db !== undefined) {
        const transaction = this.db.transaction(this.table, 'readwrite');
        const store = transaction.objectStore(this.table);
        const request = store.add(data);
        request.onsuccess = function(e) {
          console.log('write log success，the data is' + data);
        };
        request.onerror = function(e) {
          console.error('write log fail', e);
        };
      } else {
        // 由于indexedDB是异步的，第一次打开页面时db可能还没有完成初始化，因此需要做一次1秒的延迟
        console.error('由于db还没有初始化完成，延迟1秒以后再记录日志');
        setTimeout(() => {
          this.addLog(data, cnt + 1);
        }, 1000);
      }
    } else {
      // 如果db还没有完成初始化，放弃记录日志
      console.error('由于db始终没有初始化完成，无法记录日志');
    }
  }

  writeLog(loginfo: any) {
    const now = new Date();
    if (typeof loginfo === 'undefined') {
      loginfo = '';
    } else if (typeof loginfo === 'object') {
      loginfo = JSON.stringify(loginfo);
    }
    const logMsg =
      '【' + formmatDate(now, 'yyyy-MM-dd-hh:mm:ss') + '】' + loginfo;
    this.addLog(logMsg, 1);
    console.log(
      '%c ddLog %c ' + logMsg + ' ',
      'background: rgb(81, 81, 81); color: #fff;',
      'background: rgb(78, 184, 153); color: #fff'
    );
  }

  // closeDb() {
  //   this.db.close();
  //   console.info('indexedDB关闭了');
  // },
}



/*
 db: 数据库名
 storeName： 数据表名
 indexKey：索引的key
 indexVal: 索引的value
*/

// 新增数据，最好不要用传参方式带入db，有可能会带入一个空的db    /*
// 写入的日志 的数据结构 采取json var data = { time : new Date().getTime(), msg :
//   '加入一条新的日志数据' }
//
// 调用addLog函数，插入一条数据data
// addLog(data, 1)


export default DB_Instance